问题: 正则表达式中^和#符号的作用是什么?

👇 点击展开/折叠 面试背诵模板(建议先背这个) `^`在正则中有两种作用:作为**行首锚定**,匹配字符串或行的起始位置;在字符类`[^]`中作为**取反符号**,表示匹配除指定字符外的任意字符。`#`在普通正则中无特殊含义,仅匹配字面量`#`字符,但在`re.VERBOSE`模式下用作**行内注释**的起始标记,用于在复杂正则中添加可读性注释。
---

^ 的两种核心用途

使用位置 含义 示例
模式最外层(如 ^abc) 匹配字符串开头位置 ^Hello 匹配 "Hello world",不匹配 "Say Hello"
字符类内部(如 [^0-9]) 对字符集合取反 [^a-z] 匹配任意非小写字母字符
1
2
3
4
5
6
7
8
import re

# ^ 作为行首锚定
print(re.match(r'^Hello', 'Hello world')) # ✅ 匹配
print(re.match(r'^Hello', 'Say Hello')) # ❌ None

# ^ 在字符类中取反
print(re.findall(r'[^0-9]', 'a1b2c3')) # ['a', 'b', 'c']

### 锚定与 ^` 的成对使用

^ 和 $ 通常成对出现,用于精确匹配整个字符串或行:

1
2
3
4
5
6
7
# 完全匹配(开头到结尾)
print(re.fullmatch(r'^\d+$', '123')) # ✅ 匹配(等价于 \d+)
print(re.fullmatch(r'^\d+$', '123a')) # ❌ None

# 多行模式下的行首行尾(re.MULTILINE)
text = "apple\nbanana\ncherry"
print(re.findall(r'^b\w+', text, re.MULTILINE)) # ['banana'](匹配第二行行首)

# 在正则中的特殊行为

普通模式(默认)

# 仅作为普通字面量字符匹配自身。

1
print(re.findall(r'#\d+', '编号 #001, #002'))   # ['#001', '#002']

re.VERBOSE 模式(忽略空白和注释)

启用 re.VERBOSE 后,# 及其后的行内内容被忽略,可用于为复杂正则添加注释,提升可读性。

1
2
3
4
5
6
7
8
9
pattern = re.compile(r'''
^ # 匹配行首
\d{3} # 匹配三位数字
[-\s]? # 可选分隔符(- 或空格)
\d{4} # 匹配四位数字
$ # 匹配行尾
''', re.VERBOSE)

print(pattern.match('123-4567')) # ✅

^ 与 \A、### 与 \Z` 的区别(拓展)

锚定符 匹配位置 是否受 re.MULTILINE 影响
^ 字符串开头 / 每行开头 ✅ 是(多行模式下匹配行首)
\A 字符串绝对开头(不受多行影响) ❌ 否
$ 字符串末尾 / 每行末尾 ✅ 是(多行模式下匹配行尾)
\Z 字符串绝对末尾(不受多行影响) ❌ 否
1
2
3
text = "apple\nbanana"
print(re.findall(r'^\w+', text, re.MULTILINE)) # ['apple', 'banana']
print(re.findall(r'\A\w+', text, re.MULTILINE)) # ['apple'](仅开头)